In [ ]:
# Importação de bibliotecas
import os
import pandas as pd
import seaborn as sns
import folium
import geopandas as gpd
import matplotlib.pyplot as plt
import numpy as np
import random

from branca import colormap as cmap
from folium import Circle, Choropleth, Marker
from folium.plugins import  MarkerCluster, TagFilterButton
from matplotlib import pyplot as plt

import warnings
warnings.filterwarnings("ignore")

Visualização e estruturação do arquivo¶

In [ ]:
# Especificação do caminho para a pasta "archive" relativo
pasta_archives = "archive"

# Nome do arquivo CSV que você deseja abrir
nome_arquivo_csv = "Brazil Total highway crashes 2010 - 2023.csv"

# Combine o caminho da pasta "archive" com o nome do arquivo CSV
caminho_completo = os.path.join(pasta_archives, nome_arquivo_csv)

# Verifique se o arquivo existe
if os.path.exists(caminho_completo):
    df = pd.read_csv(caminho_completo, low_memory=False)
else:
    print(f'O arquivo {caminho_completo} não existe.')

# Configurando modo de exibição de colunas e linhas
pd.set_option("display.max_columns", None)
pd.set_option("display.max_rows",None)
df.head()
Out[ ]:
data horario n_da_ocorrencia tipo_de_ocorrencia km trecho sentido lugar_acidente tipo_de_acidente automovel bicicleta caminhao moto onibus outros tracao_animal transporte_de_cargas_especiais trator_maquinas utilitarios ilesos levemente_feridos moderadamente_feridos gravemente_feridos mortos
0 01/01/2010 04:21:00 18 sem vítima 167 BR-393/RJ Norte Rodovia do Aço Derrapagem 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 0.0 0.0 0.0 0.0
1 01/01/2010 02:13:00 20 sem vítima 269,5 BR-116/PR Sul Autopista Regis Bittencourt Colisão Traseira 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN
2 01/01/2010 03:35:00 000024/2010 sem vítima 77 BR-290/RS Norte Concepa COLISÃO LATERAL 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 0.0 0.0 0.0 0.0
3 01/01/2010 07:31:00 000038/2010 sem vítima 52 BR-116/RS Norte Concepa QUEDA DE MOTO 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1 0.0 0.0 0.0 0.0
4 01/01/2010 04:57:00 000027/2010 sem vítima 33 BR-290/RS Norte Concepa QUEDA DE MOTO 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1 0.0 0.0 0.0 0.0
In [ ]:
# Resumo estatístico do DataFrame
df.describe()
Out[ ]:
bicicleta onibus outros tracao_animal trator_maquinas levemente_feridos moderadamente_feridos gravemente_feridos mortos
count 286533.000000 298905.000000 333473.000000 264040.000000 244183.000000 429776.000000 325635.000000 295579.000000 293688.000000
mean 0.034338 0.093103 0.236589 0.004927 0.003952 0.681429 0.262069 0.078504 0.066159
std 0.189994 0.308265 0.480300 0.070560 0.075154 1.004886 0.578391 0.326734 0.306649
min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
50% 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
75% 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000
max 5.000000 6.000000 9.000000 3.000000 6.000000 51.000000 34.000000 27.000000 31.000000
In [ ]:
df.dtypes
Out[ ]:
data                               object
horario                            object
n_da_ocorrencia                    object
tipo_de_ocorrencia                 object
km                                 object
trecho                             object
sentido                            object
lugar_acidente                     object
tipo_de_acidente                   object
automovel                          object
bicicleta                         float64
caminhao                           object
moto                               object
onibus                            float64
outros                            float64
tracao_animal                     float64
transporte_de_cargas_especiais     object
trator_maquinas                   float64
utilitarios                        object
ilesos                             object
levemente_feridos                 float64
moderadamente_feridos             float64
gravemente_feridos                float64
mortos                            float64
dtype: object

Limpeza dos valores dos acidentes¶

In [ ]:
vl = df["tipo_de_ocorrencia"].value_counts()
print(f"Tipo de ocorrência: \n\n\n", vl)
Tipo de ocorrência: 


 sem vítima                                                   411519
com vítima                                                   197166
Sem vítima                                                    58680
Acidente sem Vítima                                           23886
3 - Acidente com Danos Materiais                              22884
Acidente sem vítima                                           20769
Acidente com vítima                                           18687
Com vítima                                                    18245
ac02 - Acidente com Vítima                                    15290
2 - Acidente com VITIMA                                       10098
Acidente com Vítima                                            9340
AC03 - Acidente sem VITIMA                                     8451
Acidente sem Vítimas                                           5511
AC02 - Acidente com VITIMA                                     4968
ac03 - Acidente com Danos Materiais                            4856
AC03 - ACIDENTE SEM VÍTIMA                                     3998
Acidente sem VITIMA                                            3676
Acidente com Vítimas                                           3457
Acidente com Danos Materiais                                   3452
ASV - Acidente SEM Vítima                                      2646
AC02 - ACIDENTE COM VÍTIMA                                     1944
ac03 - Acidente com vítima ilesa                               1912
Acidente com VITIMA                                            1637
ac02 - Acidente com vítima                                     1431
Atropelamento sem Morte                                        1305
ac01 - Acidente com Vítima Fatal                               1041
AV - Acidente com VITIMA                                       1008
3 - Acidente com Vitima Sem Lesão                               887
Atropelamento sem morte                                         857
Acidente com Morte                                              795
Acidente com morte                                              652
1 - Acidente com Vitima Fatal                                   503
2 - Acidente com Vitima                                         493
Atropelamento com morte                                         260
AC02-ACIDENTE COM VÍTIMA                                        254
Acidente Fatal                                                  254
Atropelamento com Morte                                         244
AC03-ACIDENTE SEM VÍTIMA                                        209
AC04 - Atropelamento                                            201
AC01 - ACIDENTE COM VÍTIMA FATAL                                162
AF - Acidente com Vitima Fatal                                  120
AC01 - Acidente com VITIMA FATAL                                102
ac01 - Acidente com vitima fatal                                 86
Acidente com VITIMA FATAL                                        85
AC05 - Atropelamento Fatal                                       67
Atropelamento                                                    62
Acidente sem Vítima - TRECHO CONTORNO                            59
Acidente COM VITIMA                                              53
AC3 - Acidente sem VITIMA                                        48
AC2 - Acidente com VITIMA                                        29
Atropelamento Fatal                                              29
ac03 - Acidente sem Vitimas                                      23
Acidente com Vítima - TRECHO CONTORNO                            22
Acidente sem vítima - TRECHO CONTORNO                            22
AC01-ACIDENTE COM VÍTIMA FATAL                                   21
ac02 - Acidente com VITIMA                                       20
 2- Acidente com VITIMA                                          19
Acidente com vítima - TRECHO CONTORNO                            17
Acidente com Vítima Fatal                                        12
A PP - Acidente envolvendo Produto Perigoso                      11
Acidente fatal                                                    5
in21 - Suícidio                                                   4
AC1 - Acidente com VITIMA FATAL                                   3
A PPV - Acidente envolvendo Produto Perigoso com vitima           3
A PPF - Acidente envolvendo Produto Perigoso vitima fatal         2
Acidente com Morte - TRECHO CONTORNO                              2
Acidente com morte - TRECHO CONTORNO                              1
Atropelamento sem morte - TRECHO CONTORNO                         1
Atropelamento sem Morte - TRECHO CONTORNO                         1
ac01 - Acidente com Vitima Fatal                                  1
Name: tipo_de_ocorrencia, dtype: int64
In [ ]:
limpeza_ocorrencia = {
    "sem vítima":"sem vítima",
    "com vítima":"com vítima",
    "Sem vítima":"sem vítima",
    "Acidente sem Vítima":"sem vítima",
    "Acidente com Danos Materiais":"com danos materiais",
    "Acidente sem vítima":"sem vítima",
    "Acidente com vítima":"com vítima",
    "Com vítima":"com vítima",
    "ac02 - Acidente com Vítima":"com vítima",
    "2 - Acidente com VITIMA":"com vítima",
    "Acidente com Vítima":"com vítima",
    "AC03 - Acidente sem VITIMA":"sem vítima",
    "Acidente sem Vítimas":"sem vítima",
    "AC02 - Acidente com VITIMA":"com vítima",
    "ac03 - Acidente com Danos Materiais":"com danos materiais",
    "AC03 - ACIDENTE SEM VÍTIMA":"sem vítima",
    "Acidente sem VITIMA":"sem vítima",
    "Acidente com Vítimas":"com vítima",
    "Acidente com Danos Materiais":"com danos materiais",
    "ASV - Acidente SEM Vítima":"sem vítima",
    "AC02 - ACIDENTE COM VÍTIMA":"com vítima",
    "ac03 - Acidente com vítima ilesa":"com vítima ilesa",
    "Acidente com VITIMA":"com vítima",
    "ac02 - Acidente com vítima":"com vítima",
    "Atropelamento sem Morte":"atropelamento sem vítima fatal",
    "ac01 - Acidente com Vítima Fatal":"com vítima fatal",
    "AV - Acidente com VITIMA":"com vítima",
    "3 - Acidente com Vitima Sem Lesão":"com vítima ilesa",
    "Atropelamento sem morte":"atropelamento sem vítima fatal",
    "Acidente com Morte":"com vítima fatal",
    "Acidente com morte":"com vítima fatal",
    "1 - Acidente com Vitima Fatal":"com vítima fatal",
    "2 - Acidente com Vitima":"com vítima",
    "Atropelamento com morte":"atropelamento com vítima fatal",
    "AC02-ACIDENTE COM VÍTIMA":"com vítima",
    "Acidente Fatal":"com vítima fatal",
    "Atropelamento com Morte":"atropelamento com vítima fatal",
    "AC03-ACIDENTE SEM VÍTIMA":"sem vítima",
    "AC04 - Atropelamento":"atropelamento",
    "AC01 - ACIDENTE COM VÍTIMA FATAL":"com vítima fatal",
    "AF - Acidente com Vitima Fatal":"com vítima fatal",
    "AC01 - Acidente com VITIMA FATAL":"com vítima fatal",
    "ac01 - Acidente com vitima fatal":"com vítima fatal",
    "Acidente com VITIMA FATAL":"com vítima fatal",
    "AC05 - Atropelamento Fatal":"atropelamento com vítima fatal",
    "Atropelamento":"atropelamento",
    "Acidente sem Vítima - TRECHO CONTORNO":"sem vítima",
    "Acidente COM VITIMA":"com vítima",
    "AC3 - Acidente sem VITIMA":"sem vítima",
    "AC2 - Acidente com VITIMA":"com vítima",
    "Atropelamento Fatal":"atropelamento com vítima fatal",
    "ac03 - Acidente sem Vitimas":"sem vítima",
    "Acidente com Vítima - TRECHO CONTORNO":"com vítima",
    "Acidente sem vítima - TRECHO CONTORNO":"sem vítima",
    "AC01-ACIDENTE COM VÍTIMA FATAL":"com vítima fatal",
    "ac02 - Acidente com VITIMA":"com vítima",
    " 2- Acidente com VITIMA":"com vítima",
    "Acidente com vítima - TRECHO CONTORNO":"com vítima",
    "Acidente com Vítima Fatal":"com vítima fatal",
    "A PP - Acidente envolvendo Produto Perigoso":"com produto perigoso",
    "Acidente fatal":"com vítima fatal",
    "in21 - Suícidio":"suicídio",
    "AC1 - Acidente com VITIMA FATAL":"com vítima fatal",
    "A PPV - Acidente envolvendo Produto Perigoso com vitima":"com produto perigoso e com vítima",
    "A PPF - Acidente envolvendo Produto Perigoso vitima fatal":"com produto perigoso e com vítima fatal",
    "Acidente com Morte - TRECHO CONTORNO":"com vítima fatal",
    "Acidente com morte - TRECHO CONTORNO":"com vítima fatal",
    "Atropelamento sem morte - TRECHO CONTORNO":"atropelamento sem vítima fatal",
    "Atropelamento sem Morte - TRECHO CONTORNO":"atropelamento sem vítima fatal",
    "3 - Acidente com Danos Materiais":"com danos materiais",
    "ac01 - Acidente com Vitima Fatal":"com vítima fatal"
}
In [ ]:
df["tipo_de_ocorrencia"] = df["tipo_de_ocorrencia"].replace(limpeza_ocorrencia)
In [ ]:
vl = df["tipo_de_ocorrencia"].value_counts()
print(f"Tipo de ocorrência: \n\n\n", vl)
Tipo de ocorrência: 


 sem vítima                                 539497
com vítima                                 284178
com danos materiais                         31192
com vítima fatal                             3845
com vítima ilesa                             2799
atropelamento sem vítima fatal               2164
atropelamento com vítima fatal                600
atropelamento                                 263
com produto perigoso                           11
suicídio                                        4
com produto perigoso e com vítima               3
com produto perigoso e com vítima fatal         2
Name: tipo_de_ocorrencia, dtype: int64

Limpeza dos valores do sentido¶

In [ ]:
vl = df["sentido"].value_counts()
print(f"Sentido: \n\n\n", vl)
Sentido: 


 Norte                      305564
Sul                        302783
Pista Norte                 64831
Pista Sul                   61131
Decrescente                 38170
Crescente                   38015
Leste                       20829
Oeste                       19345
RJ                           5319
JF                           4201
NORTE                        1053
SUL                           788
N                             277
S                             210
Ambos                         189
 Norte                         50
Sul - TRECHO CONTORNO          43
 Sul                           39
Norte - TRECHO CONTORNO        26
Name: sentido, dtype: int64
In [ ]:
limpeza_sentido = {
    "Norte":"norte",
    "Sul":"sul",
    "Pista Norte":"norte",
    "Pista Sul":"sul",
    "Decrescente":"decrescente",
    "Crescente":"crescente",
    "Leste":"leste",
    "Oeste":"oeste",
    "RJ":"outros",
    "JF":"outros",
    "NORTE":"norte",
    "SUL":"sul",
    "N":"norte",
    "S":"sul",
    "Ambos":"outros",
    "Norte":"norte",
    "Sul - TRECHO CONTORNO":"sul",
    "Sul":"sul",
    "Norte - TRECHO CONTORNO":"norte",
    " Norte":"norte",
    " Sul":"sul"
}
In [ ]:
df["sentido"] = df["sentido"].replace(limpeza_sentido)
In [ ]:
df["sentido"].value_counts()
Out[ ]:
norte          371801
sul            364994
decrescente     38170
crescente       38015
leste           20829
oeste           19345
outros           9709
Name: sentido, dtype: int64

Quais trechos das rodovias brasileiras privadas são os mais perigosos?¶

In [ ]:
df["lugar_acidente"].value_counts()
Out[ ]:
Autopista Litoral Sul          123319
Novadutra                      114994
Autopista Fernão Dias          108496
Autopista Regis Bittencourt     73109
Concer                          48022
Concebra                        46810
Autopista Fluminense            46252
Via Bahia                       42856
ECO101                          38029
VIA040                          37723
Cro                             31015
Autopista Planalto Sul          23516
MSVIA                           19109
Crt                             16462
Concepa                         13622
ECO050                          13015
Transbrasiliana                 12520
Rodovia do Aço                  11541
Via Costeira                     9325
RIOSP                            9163
Ecosul                           8059
Via Sul                          6608
Ecoponte                         3918
Ecoriominas                      2701
Ecovias do Araguaia              2014
Ecovias do Cerrado               1879
Via Brasil                        484
Name: lugar_acidente, dtype: int64
In [ ]:
sns.countplot(data=df, x=df['lugar_acidente'])
plt.xticks(rotation=90)
plt.show()
No description has been provided for this image
In [ ]:
grupo_lugar_acidente = df.groupby('lugar_acidente').sum()

grupo_lugar_acidente[:5]
Out[ ]:
bicicleta onibus outros tracao_animal trator_maquinas levemente_feridos moderadamente_feridos gravemente_feridos mortos
lugar_acidente
Autopista Fernão Dias 418.0 2102.0 8473.0 13.0 22.0 35758.0 6076.0 1904.0 1903.0
Autopista Fluminense 853.0 2498.0 4983.0 9.0 14.0 17873.0 7088.0 1781.0 1498.0
Autopista Litoral Sul 1646.0 1530.0 13590.0 28.0 31.0 30755.0 6402.0 2027.0 1676.0
Autopista Planalto Sul 208.0 483.0 1644.0 1.0 51.0 7921.0 773.0 1208.0 746.0
Autopista Regis Bittencourt 424.0 4750.0 5105.0 1016.0 20.0 20423.0 4343.0 1110.0 1364.0
In [ ]:
df_lugar_ferimento = grupo_lugar_acidente[['levemente_feridos', 'moderadamente_feridos', 'gravemente_feridos']]

df_lugar_ferimento.reset_index(inplace=True)

df_lugar_ferimento.columns = ['lugar de acidente', 'grau de ferimento leve', 'grau de ferimento moderado', 'grau de ferimento grave']

df_lugar_ferimento[:5]
Out[ ]:
lugar de acidente grau de ferimento leve grau de ferimento moderado grau de ferimento grave
0 Autopista Fernão Dias 35758.0 6076.0 1904.0
1 Autopista Fluminense 17873.0 7088.0 1781.0
2 Autopista Litoral Sul 30755.0 6402.0 2027.0
3 Autopista Planalto Sul 7921.0 773.0 1208.0
4 Autopista Regis Bittencourt 20423.0 4343.0 1110.0
In [ ]:
# Supondo que df_lugar_mortalidade seja seu DataFrame
plt.figure(figsize=(12, 6))

# Calcular a contagem de mortos, vítimas e ilesos por local de acidente
contagem_por_local = df_lugar_ferimento.groupby('lugar de acidente')[['grau de ferimento leve', 'grau de ferimento moderado', 'grau de ferimento grave']].sum().reset_index()

# Criar o gráfico de barras empilhado
plt.bar(contagem_por_local['lugar de acidente'], contagem_por_local['grau de ferimento grave'], label='Grave', color='#04364A')
plt.bar(contagem_por_local['lugar de acidente'], contagem_por_local['grau de ferimento moderado'], label='Moderado', color='#176B87', bottom=contagem_por_local['grau de ferimento grave'])
plt.bar(contagem_por_local['lugar de acidente'], contagem_por_local['grau de ferimento leve'], label='Leve', color='#64CCC5', bottom=contagem_por_local['grau de ferimento grave'] + contagem_por_local['grau de ferimento moderado'])

plt.xticks(rotation=90)
plt.xlabel('Local de Acidente')
plt.ylabel('Contagem')
plt.title('Contagem de Grau de Ferimento por Local de Acidente')
plt.legend()
plt.show()
No description has been provided for this image
In [ ]:
df_lugar_mortalidade = grupo_lugar_acidente[['mortos']]

df_lugar_mortalidade.reset_index(inplace=True)

df_lugar_mortalidade.columns = ['lugar de acidente', 'mortos']

df_lugar_mortalidade[:5]
Out[ ]:
lugar de acidente mortos
0 Autopista Fernão Dias 1903.0
1 Autopista Fluminense 1498.0
2 Autopista Litoral Sul 1676.0
3 Autopista Planalto Sul 746.0
4 Autopista Regis Bittencourt 1364.0
In [ ]:
plt.figure(figsize=(10, 6))

# Calcular a contagem de mortos por local de acidente
contagem_mortos = df_lugar_mortalidade.groupby('lugar de acidente')['mortos'].sum().reset_index()

# Criar o gráfico de barras
plt.bar(contagem_mortos['lugar de acidente'], contagem_mortos['mortos'], color='#713ABE')

plt.xticks(rotation=90)
plt.xlabel('Local de Acidente')
plt.ylabel('Contagem de Mortos')
plt.title('Contagem de Mortos por Local de Acidente')
plt.show()
No description has been provided for this image
In [ ]:
# Filtrar apenas as linhas com "com vítimas" e "sem vítimas"
df_filtrado_ocorrencia = df[df['tipo_de_ocorrencia'].isin(['com vítima', 'sem vítima'])]

# Realize a contagem das ocorrências de "com vítimas" e "sem vítimas" para cada rua
df_lugar_ocorrencia = df_filtrado_ocorrencia.groupby(['lugar_acidente', 'tipo_de_ocorrencia']).size().unstack(fill_value=0)

df_lugar_ocorrencia.columns = ['com vitimas', 'sem vitimas']

df_lugar_ocorrencia_vitimas = df_lugar_ocorrencia

df_lugar_ocorrencia_vitimas.reset_index(inplace=True)

df_lugar_ocorrencia_vitimas.columns = ['Lugar de Acidente', 'Com Vítimas', 'Sem Vítimas']

df_lugar_ocorrencia_vitimas[:5]
Out[ ]:
Lugar de Acidente Com Vítimas Sem Vítimas
0 Autopista Fernão Dias 30760 71025
1 Autopista Fluminense 18194 26038
2 Autopista Litoral Sul 32692 82707
3 Autopista Planalto Sul 7418 15067
4 Autopista Regis Bittencourt 19720 47717
In [ ]:
# Supondo que df_lugar_mortalidade seja seu DataFrame
plt.figure(figsize=(12, 6))

# Calcular a contagem de mortos, vítimas e ilesos por local de acidente
contagem_por_local = df_lugar_ocorrencia_vitimas.groupby('Lugar de Acidente')[['Com Vítimas', 'Sem Vítimas']].sum().reset_index()

# Criar o gráfico de barras empilhado
plt.bar(contagem_por_local['Lugar de Acidente'], contagem_por_local['Com Vítimas'], label='Com Vítimas', color='#FF9B50')
plt.bar(contagem_por_local['Lugar de Acidente'], contagem_por_local['Sem Vítimas'], label='Sem Vítimas', color='#C63D2F', bottom=contagem_por_local['Com Vítimas'])

plt.xticks(rotation=90)
plt.xlabel('Local de Acidente')
plt.ylabel('Contagem')
plt.title('Contagem de Vítimas por Local de Acidente')
plt.legend()
plt.show()
No description has been provided for this image
In [ ]:
filtro_trecho = df["trecho"].str.contains(r'BR-\d+\/[A-Z]{2}$')

Quais são os estados brasileiros com maior incidência de acidentes?¶

In [ ]:
# Extrair os estados da coluna 'trecho' usando uma expressão regular
df['estado'] = df['trecho'].str.extract(r'\/([A-Z]{2})')

df_estados_contagem = df['estado'].value_counts()

df_estados_acidentes = pd.DataFrame(df_estados_contagem).reset_index()
df_estados_acidentes.columns = ['Estado', 'Total de Acidentes']

df_estados_acidentes = df_estados_acidentes.sort_values(by='Total de Acidentes', ascending=False)

df_estados_acidentes[:5]
Out[ ]:
Estado Total de Acidentes
0 RJ 176428
1 MG 150434
2 SP 120187
3 SC 108155
4 PR 100973
In [ ]:
brasil_gdf_arquivo = "archive/brazil_geo.json"

brasil_gdf = gpd.read_file(brasil_gdf_arquivo)

display(brasil_gdf.head())
id name geometry
0 AC Acre POLYGON ((-73.33251 -7.32488, -73.27482 -7.350...
1 AL Alagoas MULTIPOLYGON (((-35.90153 -9.86181, -35.90153 ...
2 AP Amapá MULTIPOLYGON (((-50.02403 0.85986, -50.02403 0...
3 AM Amazonas MULTIPOLYGON (((-53.62548 -26.88481, -53.61900...
4 BA Bahia MULTIPOLYGON (((-38.69708 -17.97903, -38.69708...
In [ ]:
df_regioes_estados_acidentes = brasil_gdf.merge(df_estados_acidentes, left_on='id', right_on='Estado')

df_regioes_estados_acidentes[:5]
Out[ ]:
id name geometry Estado Total de Acidentes
0 BA Bahia MULTIPOLYGON (((-38.69708 -17.97903, -38.69708... BA 42867
1 DF Distrito Federal POLYGON ((-48.03603 -15.50022, -47.77200 -15.5... DF 3728
2 ES Espírito Santo MULTIPOLYGON (((-40.88403 -21.16125, -40.88403... ES 37737
3 GO Goiás POLYGON ((-50.15817 -12.41238, -50.15942 -12.4... GO 36420
4 MT Mato Grosso POLYGON ((-57.60524 -8.66285, -57.59355 -8.707... MT 31196
In [ ]:
coordenadas = [-15.77972, -47.92972]
zstart = 4

colors = ['LightBlue', 'LightGreen', 'Green', 'Orange', 'DarkOrange', 'DarkRed']
style_function = lambda x: {'weight': 0.8, 
                            'color': 'black',
                            'fillColor': colormap(x['properties']['Total de Acidentes']), 
                            'fillOpacity': 0.75}

colormap = cmap.LinearColormap(colors = colors, 
                            vmin = df_regioes_estados_acidentes['Total de Acidentes'].min(), 
                            vmax = df_regioes_estados_acidentes['Total de Acidentes'].max(), 
                            caption = f"Total de Acidentes")

map_estados_acidentes = folium.Map(location = coordenadas, tiles = 'cartodbpositron', zoom_start = zstart)

colormap.add_to(map_estados_acidentes)

folium.features.GeoJson(
    df_regioes_estados_acidentes,
    style_function = style_function
).add_to(map_estados_acidentes)

map_estados_acidentes
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Quais são os horários mais propícios para ocorrência de acidentes?¶

In [ ]:
attrs = ['km', 'trecho', 'sentido', 'lugar_acidente','ilesos','levemente_feridos', 'moderadamente_feridos', 'gravemente_feridos', 'mortos', 'data']
df_horario_ferimentos = df[attrs]

df_horario_ferimentos = df_horario_ferimentos.fillna(0)

df_horario_ferimentos['ilesos'].fillna(0, inplace=True)

for coluna in attrs:
    if df_horario_ferimentos[coluna].dtype == 'object':
        continue
    df_horario_ferimentos[coluna] = pd.to_numeric(df_horario_ferimentos[coluna], errors='coerce')

df_horario_ferimentos['ano'] = df_horario_ferimentos['data'].str[6:]
conversao_ano = df_horario_ferimentos['ano'].astype(int)
df_horario_ferimentos['ano'] = conversao_ano

df_horario_ferimentos['ilesos'] = pd.to_numeric(df_horario_ferimentos['ilesos'], errors='coerce')

contagem_por_ano = df_horario_ferimentos.groupby('ano')[['ilesos', 'levemente_feridos', 'moderadamente_feridos', 'gravemente_feridos', 'mortos']].sum()

contagem_por_ano = contagem_por_ano.rename(columns={'ilesos':'Ilesos', 'levemente_feridos':'Levemente Feridos', 'moderadamente_feridos':'Moderadamente Feridos', 'gravemente_feridos':'Gravemente Feridos', 'mortos':'Mortos', 'ano':'Anos'})
In [ ]:
contagem_por_ano = contagem_por_ano.reset_index()

contagem_por_ano[:5]
Out[ ]:
ano Ilesos Levemente Feridos Moderadamente Feridos Gravemente Feridos Mortos
0 2010 123302.0 18774.0 5508.0 1582.0 1472.0
1 2011 133759.0 20021.0 6262.0 1745.0 1514.0
2 2012 140085.0 21424.0 5908.0 1781.0 1468.0
3 2013 136936.0 20837.0 5458.0 1572.0 1502.0
4 2014 147719.0 24229.0 6486.0 1967.0 1684.0
In [ ]:
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Moderadamente Feridos'], label='Moderadamente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Gravemente Feridos'], label='Gravemente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Levemente Feridos'], label='Levemente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Mortos'], label='Mortos', marker='o', linestyle='-')

plt.xlabel('Ano')
plt.ylabel('Número de Pessoas')
plt.title('Número de Pessoas Feridas por Categoria e Ano')

plt.legend()

plt.grid(True)
plt.show()
No description has been provided for this image
In [ ]:
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Ilesos'], label='Ilesos', marker='o', linestyle='-')

plt.xlabel('Ano')
plt.ylabel('Número de Pessoas')
plt.title('Número de Pessoas Feridas por Categoria e Ano')

plt.legend()

plt.grid(True)
plt.show()
No description has been provided for this image
In [ ]:
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Moderadamente Feridos'], label='Moderadamente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Gravemente Feridos'], label='Gravemente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Levemente Feridos'], label='Levemente Feridos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Mortos'], label='Mortos', marker='o', linestyle='-')
plt.plot(contagem_por_ano['ano'], contagem_por_ano['Ilesos'], label='Ilesos', marker='o', linestyle='-')

plt.xlabel('Ano')
plt.ylabel('Número de Pessoas')
plt.title('Número de Pessoas Feridas por Categoria e Ano')

plt.legend()

plt.grid(True)
plt.show()
No description has been provided for this image

Quais são os horários mais propícios para ocorrência de acidentes?¶

In [ ]:
attrs = ['horario', 'bicicleta', 'caminhao', 'moto', 'onibus', 'outros', 'tracao_animal', 'transporte_de_cargas_especiais', 'trator_maquinas', 'utilitarios']
df_horario_acidentes = df[attrs]

df_horario_acidentes = df_horario_acidentes.fillna(0)

for coluna in attrs:
    if coluna != "horario":
        df_horario_acidentes[coluna] = pd.to_numeric(df_horario_acidentes[coluna], errors='coerce')

df_horario_acidentes['horario'] = pd.to_datetime(df_horario_acidentes['horario'])

df_horario_acidentes['hora'] = df_horario_acidentes['horario'].dt.strftime('%H')

df_horario_acidentes['total_acidentes'] = df_horario_acidentes[['bicicleta', 'caminhao', 'moto', 'onibus', 'outros', 'tracao_animal', 'transporte_de_cargas_especiais', 'trator_maquinas', 'utilitarios']].sum(axis=1)

contagem_por_horario = df_horario_acidentes.groupby('hora')[['total_acidentes']].sum()
In [ ]:
plt.bar(contagem_por_horario.index, contagem_por_horario['total_acidentes'], color='#C23373')
plt.xlabel('Horário')
plt.ylabel('Total de Acidentes')
plt.title('Total de Acidentes por Horário')
plt.xticks(rotation=90)

plt.show()
No description has been provided for this image

Quais tipos de automóveis estão mais envolvidos em acidentes?¶

In [ ]:
attrs = ['bicicleta', 'caminhao', 'moto', 'onibus', 'outros', 'tracao_animal', 'transporte_de_cargas_especiais', 'trator_maquinas', 'utilitarios']
df_automoveis_acidentes = df[attrs]

df_automoveis_acidentes = df_automoveis_acidentes.fillna(0)

for coluna in attrs:
    df_automoveis_acidentes[coluna] = pd.to_numeric(df_automoveis_acidentes[coluna], errors='coerce')

contagem_automoveis_acidentes = df_automoveis_acidentes.sum(numeric_only=True)

df_automoveis_acidentes_total = pd.DataFrame({
    'Veículo': attrs,
    'Total de Acidentes': contagem_automoveis_acidentes
})

df_automoveis_acidentes_total = df_automoveis_acidentes_total.sort_values(by='Total de Acidentes', ascending=False)
In [ ]:
limpeza_veiculos = {
    'caminhao': 'Caminhão',
    'moto':'Moto',
    'outros':'Outros',
    'utilitarios':'Utilitários',
    'onibus':'Ônibus',
    'bicicleta':'Bicicleta',
    'transporte_de_cargas_especiais':'Transporte de Cargas Especiais',
    'tracao_animal':'Tração Animal',
    'trator_maquinas':'Trator Máquinas'
}

df_automoveis_acidentes_total['Veículo'] = df_automoveis_acidentes_total['Veículo'].replace(limpeza_veiculos)

print(df_automoveis_acidentes_total.to_string(index=False))
                       Veículo  Total de Acidentes
                      Caminhão            271106.0
                          Moto            141910.0
                        Outros             78896.0
                   Utilitários             61750.0
                        Ônibus             27829.0
                     Bicicleta              9839.0
Transporte de Cargas Especiais              4844.0
                 Tração Animal              1301.0
               Trator Máquinas               965.0
In [ ]:
num_veiculos = len(df_automoveis_acidentes_total)
unique_colors = plt.cm.get_cmap('tab20', num_veiculos)
colors = [unique_colors(i) for i in range(num_veiculos)]

plt.figure(figsize=(20, 10))
plt.pie(df_automoveis_acidentes_total['Total de Acidentes'], labels=None, autopct='%1.1f%%', startangle=140, colors=colors)
plt.title('Distribuição de Acidentes por Tipo de Automóvel')

plt.legend(df_automoveis_acidentes_total['Veículo'], loc='upper right', bbox_to_anchor=(1.0, 1.0))

plt.axis('equal')
plt.show()
No description has been provided for this image